textview: Remove extra magic for drawing children
authorBenjamin Otte <otte@redhat.com>
Tue, 3 Apr 2012 16:41:25 +0000 (18:41 +0200)
committerBenjamin Otte <otte@redhat.com>
Sat, 7 Apr 2012 11:01:25 +0000 (13:01 +0200)
Instead, just draw the children. The cairo code will keep track of
things, so there's no need to track things.
Also, the old code was doing it wrong.

https://bugzilla.gnome.org/show_bug.cgi?id=672544

gtk/gtktextdisplay.c
gtk/gtktextdisplay.h
gtk/gtktextutil.c
gtk/gtktextview.c

index db88dcab823b5da1e8a4dd95a2a1de8a29aadeec..863cb3c41bece0b8dacffe69f9c93483b0b9aa2f 100644 (file)
@@ -108,7 +108,6 @@ struct _GtkTextRenderer
   cairo_t *cr;
   
   GdkRGBA *error_color;        /* Error underline color for this widget */
-  GList *widgets;              /* widgets encountered when drawing */
 
   GdkRGBA rgba[4];
   guint8  rgba_set[4];
@@ -423,12 +422,7 @@ gtk_text_renderer_draw_shape (PangoRenderer   *renderer,
     }
   else if (GTK_IS_WIDGET (attr->data))
     {
-      GtkWidget *widget;
-      
-      widget = GTK_WIDGET (attr->data);
-
-      text_renderer->widgets = g_list_prepend (text_renderer->widgets,
-                                              g_object_ref (widget));
+      /* nothing to do */
     }
   else
     g_assert_not_reached (); /* not a pixbuf or widget */
@@ -497,11 +491,10 @@ text_renderer_begin (GtkTextRenderer *text_renderer,
 
 /* Returns a GSList of (referenced) widgets encountered while drawing.
  */
-static GList *
+static void
 text_renderer_end (GtkTextRenderer *text_renderer)
 {
   GtkStyleContext *context;
-  GList *widgets = text_renderer->widgets;
 
   cairo_restore (text_renderer->cr);
 
@@ -512,15 +505,11 @@ text_renderer_end (GtkTextRenderer *text_renderer)
   text_renderer->widget = NULL;
   text_renderer->cr = NULL;
 
-  text_renderer->widgets = NULL;
-
   if (text_renderer->error_color)
     {
       gdk_rgba_free (text_renderer->error_color);
       text_renderer->error_color = NULL;
     }
-
-  return widgets;
 }
 
 static cairo_region_t *
@@ -816,8 +805,7 @@ get_text_renderer (void)
 void
 gtk_text_layout_draw (GtkTextLayout *layout,
                       GtkWidget *widget,
-                      cairo_t *cr,
-                      GList **widgets)
+                      cairo_t *cr)
 {
   GtkStyleContext *context;
   gint offset_y;
@@ -826,7 +814,6 @@ gtk_text_layout_draw (GtkTextLayout *layout,
   gboolean have_selection;
   GSList *line_list;
   GSList *tmp_list;
-  GList *tmp_widgets;
   GdkRectangle clip;
 
   g_return_if_fail (GTK_IS_TEXT_LAYOUT (layout));
@@ -931,11 +918,7 @@ gtk_text_layout_draw (GtkTextLayout *layout,
 
   gtk_text_layout_wrap_loop_end (layout);
 
-  tmp_widgets = text_renderer_end (text_renderer);
-  if (widgets)
-    *widgets = tmp_widgets;
-  else
-    g_list_free_full (tmp_widgets, g_object_unref);
+  text_renderer_end (text_renderer);
 
   g_slist_free (line_list);
 }
index 3f130b4ba9a8a88fd6ca26fa127518d3610ff280..c35b13356727b5fe46e55203806d85dadbdc152a 100644 (file)
@@ -92,8 +92,7 @@ G_BEGIN_DECLS
  */
 void gtk_text_layout_draw (GtkTextLayout        *layout,
                            GtkWidget            *widget,
-                           cairo_t              *cr,
-                           GList               **widgets);
+                           cairo_t              *cr);
 
 
 G_END_DECLS
index d5a60c492bcfc6c4cb97bed1586914be24e4620a..f5eae4c6ecbaea003b8bf968982e53839cb14ab1 100644 (file)
@@ -398,7 +398,7 @@ _gtk_text_util_create_rich_drag_icon (GtkWidget     *widget,
    cairo_save (cr);
 
    cairo_translate (cr, 1 + DRAG_ICON_LAYOUT_BORDER, 1 + DRAG_ICON_LAYOUT_BORDER);
-   gtk_text_layout_draw (layout, widget, cr, NULL);
+   gtk_text_layout_draw (layout, widget, cr);
 
    cairo_restore (cr);
 
index 601f939f978d5ae25fdaf415c5dc930c4bb13a86..c61d0fb130482ed6e5cfcc2328cd54d68527f067 100644 (file)
@@ -4804,8 +4804,6 @@ gtk_text_view_paint (GtkWidget      *widget,
 {
   GtkTextView *text_view;
   GtkTextViewPrivate *priv;
-  GList *child_exposes;
-  GList *tmp_list;
   
   text_view = GTK_TEXT_VIEW (widget);
   priv = text_view->priv;
@@ -4833,33 +4831,14 @@ gtk_text_view_paint (GtkWidget      *widget,
           area->width, area->height);
 #endif
 
-  child_exposes = NULL;
-
   cairo_save (cr);
   cairo_translate (cr, -priv->xoffset, -priv->yoffset);
 
   gtk_text_layout_draw (priv->layout,
                         widget,
-                        cr,
-                        &child_exposes);
+                        cr);
 
   cairo_restore (cr);
-
-  tmp_list = child_exposes;
-  while (tmp_list != NULL)
-    {
-      GtkWidget *child = tmp_list->data;
-  
-      gtk_container_propagate_draw (GTK_CONTAINER (text_view),
-                                    child,
-                                    cr);
-
-      g_object_unref (child);
-      
-      tmp_list = tmp_list->next;
-    }
-
-  g_list_free (child_exposes);
 }
 
 static gboolean
@@ -4894,10 +4873,9 @@ gtk_text_view_draw (GtkWidget *widget,
       /* propagate_draw checks that event->window matches
        * child->window
        */
-      if (!vc->anchor)
-        gtk_container_propagate_draw (GTK_CONTAINER (widget),
-                                      vc->widget,
-                                      cr);
+      gtk_container_propagate_draw (GTK_CONTAINER (widget),
+                                    vc->widget,
+                                    cr);
       
       tmp_list = tmp_list->next;
     }